package com.ruyuan.util;//package com.shadow.util;

import com.shadow.app.App;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

/**
 * 针对 spring 提供的接口进行扩展以实现自身功能的功能
 *
 * 为什么不将 spring容器初始化、DispatcherServlet 直接在  MyServletContainerInitializer  的 onStartup 方法中就写好呢，这样 当前类(MyWebApplicationInitializer)就没有存在的必要了塞？
 * 因为 MyServletContainerInitializer 需要手动调用 run 方式才能执行到代理，如果后期项目需要放到 tomcat 以 war 包方式运行的话，就执行不到 MyServletContainerInitializer 代码了，我们又知道
 * spring web 的 resource 下面也有实现了 tomcat spi 机制的扩展配置文件，这样就算是以 war 包方式运行代码，依然可以 初始化 spring 容器,这样代码的健壮性更高
 */
public class MyWebApplicationInitializer implements WebApplicationInitializer {

    /**
     * 扩展该方法，以实现自己需要的功能
     *
     * @param servletContext the {@code ServletContext} to initialize
     * @throws ServletException
     */
    public void onStartup(ServletContext servletContext) throws ServletException {
        System.out.println("------MyWebApplicationInitializer-----------");

        // 实例化spring容器
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(App.class);

        // new DispatcherServlet() 方法里面就会调用 spring 的 refresh 方法，代码有点深
        DispatcherServlet servlet = new DispatcherServlet(context);


        ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet);
        registration.addMapping("*.do");
        registration.setLoadOnStartup(1);
    }
}
